package com.lyy.dimens_tool

import java.io.File
import java.io.FileNotFoundException
import java.io.FileOutputStream
import java.io.IOException
import java.math.BigDecimal

object MakeUtils {
    //生成文件中dp最大值 0..max
    private const val MAX_SIZE_DP = 300

    //生成文件中sp最大值 6..max
    private const val MAX_SIZE_SP = 48


    /**
     * 生成的文件名
     */
    private const val XML_NAME = "dimens.xml"

    /**
     * 生成的目标文件夹
     * 只需传宽进来就行
     *
     * @param designWidth 默认基础宽度
     * @param type 枚举类型
     * @param buildDir 生成的目标文件夹
     * @param hasDimensFile values下是否有dimens文件，根据文件内值生成
     */
    fun makeAll(designWidth: Int, type: DimenTypes, buildDir: String, hasDimensFile: Boolean) {
        try {
            //生成规则
            val folderName: String = if (type.swWidthDp > 0) {
                //适配Android 3.2+
                "values-sw" + type.swWidthDp + "dp"
            } else {
                return
            }

            //生成目标目录
            val fileDir = File(buildDir + File.separator + folderName)
            if (fileDir.exists()) {
                fileDir.listFiles()?.let {
                    for (file in it) {
                        file.delete()
                    }
                }
            } else {
                fileDir.mkdirs()
            }

            //生成values文件
            val fos = FileOutputStream(fileDir.absolutePath + File.separator + XML_NAME)
            fos.write(makeAllDimens(type, designWidth, hasDimensFile).toByteArray())
            fos.flush()
            fos.close()
        } catch (e: FileNotFoundException) {
            e.printStackTrace()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    /**
     * 生成所有的尺寸数据
     *
     * @param designWidth 基础宽度
     * @param type 生成的宽度 枚举
     * @param hasDimensFile values下是否有dimens文件，根据文件内值生成
     * @return
     */
    private fun makeAllDimens(type: DimenTypes, designWidth: Int, hasDimensFile: Boolean): String {
        var temp: String
        val sb = StringBuilder()
        try {
            sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
            sb.append("<resources>\n")
            //备份生成的相关信息
            temp = String.format("    <string name=\"base_dp\">%ddp</string>\n", type.swWidthDp)
            sb.append(temp)
            sb.append("\n")
            if (hasDimensFile) {
                for (map in DimensParse.mapSp) {
                    val spValue = px2dip(map.value, type.swWidthDp, designWidth)
                    temp = String.format("    <dimen name=\"%1\$s\">%2\$.2fsp</dimen>\n", map.key, spValue)
                    sb.append(temp)
                }
                sb.append("\n\n\n\n")
                for (map in DimensParse.mapDp) {
                    val dpValue = px2dip(map.value, type.swWidthDp, designWidth)
                    temp = String.format("    <dimen name=\"%1\$s\">%2\$.2fdp</dimen>\n", map.key, dpValue)
                    sb.append(temp)
                }
            } else {
                for (i in 0..MAX_SIZE_DP) {
                    val dpValue = px2dip(i.toDouble(), type.swWidthDp, designWidth)
                    temp = String.format("    <dimen name=\"dp_%1\$d\">%2\$.2fdp</dimen>\n", i, dpValue)
                    sb.append(temp)
                }
                sb.append("\n\n\n\n")
                for (i in 6..MAX_SIZE_SP) {
                    val spValue = px2dip(i.toDouble(), type.swWidthDp, designWidth)
                    temp = String.format("    <dimen name=\"sp_%1\$d\">%2\$.2fsp</dimen>\n", i, spValue)
                    sb.append(temp)
                }
            }


            sb.append("</resources>\n")
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return sb.toString()
    }

    /**
     * @param pxValue 基础值
     * @param sw 生成目标宽度
     * @param designWidth 基础宽度
     */
    private fun px2dip(pxValue: Double, sw: Int, designWidth: Int): Float {
        val dpValue: Double = pxValue / designWidth.toFloat() * sw
        val bigDecimal = BigDecimal(dpValue)
        return bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP).toFloat()
    }
}